一直都覺得 Migration 很神奇,只要利用程式碼就可以建立、修改資料庫裡的表,不然我都是打開 MySQL Workbench 輸入 MySQL 語法操作。
甚至是在某些不得已的時候,例如:需要更換資料庫管理系統,基本上也能快速打掉重建,並且在多人協作時,都能同步一致,拿到最新的版本。
在 系統規劃流程,你的食譜在哪? 文章內有說過,我一開始沒有規劃文件的習慣,當時使用 Migration 建立一個資料表後,後續發現此資料表需要額外新增其他欄位,所以自然而然想到去修改 Migration 的檔案,然後使用 artisan 指令再 migrate 一次。
php artisan migrate
本來以為會直接變更,但發現沒辦法哦!!!
菜雞仔如我,當時很慌張,結果自己去把資料表整個刪掉再重建XD(要多荒唐)
php artisan migrate:fresh
備註:這個指令真的別亂用,會刪除所有的表,當時是因為我才剛練習,沒有什麼重要的資料。
後來發現,原來已經 migrate 過的檔案,無法再直接使用 artisan 指令 migrate 一次。
需要使用 artisan 指令 rollback 後再 migrate!
php artisan migrate:rollback
php artisan migrate
這個指令會回退到最近一次的 migrate 操作,然後再 migrate,這樣剛剛想要新增的欄位就會出現了。
如果你想要回退到多次前的 migrate 操作,可以使用 --step 參數來指定。
例如,回退兩次:
php artisan migrate:rollback --step=2
更多關於 Migration 的資訊可以參考以下文章:
我在 設定 .env 檔案 這篇文章裡,已經有先建立好 product 資料庫,並且設定好 .env 檔案連結此資料庫。
昨天在 Laravel 專案中建立一個名為 Product 的 Model,並同時「載入預設CRUD方法」建立以下檔案:
這裡我的步驟是:在打開 Migration 前,先規劃好我的資料表!
盡可能將需要的情況都設想好,但如果真的之後需要補什麼,後續再補即可。
欄位名 | 說明 | 格式 | 包含備註內容 |
---|---|---|---|
id | ID | unsignedBigInteger | 自動遞增 |
type_id | 產品分類 | unsignedBigInteger | foreign 外鍵關聯 接受空值 預設值為空 |
product_name | 產品名稱 | varchar(255) | |
product_description | 產品描述 | text | |
price | 產品價錢 | unsignedInteger | |
created_at | 新建時間 | timestamp | |
updated_at | 更新時間 | timestamp |
欄位名 | 說明 | 格式 | 包含備註內容 |
---|---|---|---|
id | ID | unsignedBigInteger | |
name | 類別名稱 | varchar(255) | |
sort | 排序 | integer | 預設值100 |
created_at | 新建時間 | timestamp | |
updated_at | 更新時間 | timestamp |
欄位名 | 說明 | 格式 | 包含備註內容 |
---|---|---|---|
id | ID | unsignedBigInteger | |
name | 會員名稱 | varchar(255) | |
電子郵件 | varchar(255) | 唯一值 | |
email_verified_at | 驗證時間 | timestamp | 接受空值 |
password | 會員密碼 | varchar(255) | |
permission | 會員權限 | integer | 預設一般會員 |
created_at | 新建時間 | timestamp | |
updated_at | 更新時間 | timestamp |
unsignedInteger 適合存較小範圍的整數,而 unsignedBigInteger 適合需要存更大數值的情況。確保 type_id 跟 price 不會是負數且沒有小數點。
規劃好資料表後,打開昨天同時建立的 Migration 檔案:create_products_table.php
這裡的 type_id 一開始先不做「包含備註內容」的部份,等到後續新增 types 表時再做。
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('type_id')->comment('產品類別');
$table->string('product_name')->comment('產品名稱');
$table->text('product_description')->comment('產品描述');
$table->unsignedInteger('price')->comment('產品價錢');
$table->timestamps();
});
}
$table->id();
php artisan migrate
打開 MySQL Workbench
輸入指令:
SHOW TABLES;
確認有出現 products 表後,再輸入以下指令檢查資料表結構:
DESCRIBE `products`;
確認好剛才設定的欄位格式都有出現!